如何让我的机器人动起来——SLAM、导航与底盘
Overview
解决的核心问题:如何让小车自动移动到指定位置
一个简单的问题由于实际环境的复杂导致存在大量的误差
我的周围可能存在很多的障碍物,路径存在限制,我要怎么知道我周边环境的地图信息?
前往目标点的路径不一定是直线,我要怎么根据现有地图找到最优路径?
我知道小车的整体目标速度,要怎么控制电机才能让整个小车按照我的目标速度行驶?
SLAM:得到环境的整个地图
导航:根据已有的环境地图,输入要到达的目标点,根据算法输出在小车行驶过程中每个时刻的底盘速度
底盘:将导航计算出的底盘速度通过运动学结算转化为每个电机的速度,再控制每个电机按照目标速度行驶
由于 SLAM 和导航都是非常庞杂的工程框架,本次培训将不涉及对具体代码的讲解,而以整体框架的介绍为主
相信在听懂整体框架后,后续上手也不会太难 😄
SLAM
什么是 SLAM
SLAM 是 Simultaneous Localization And Mapping 的缩写,中文译作 ”同时定位与地图构建“ 。
它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动。
在实际应用中,SLAM 的过程一般会先于导航完成,通过遥控 or 自动行驶的方式让机器人先完成对环境的建图。
利用Cartographer SLAM算法跑德意志博物馆bag效果
需要实现的功能:
- 我在什么地方?——定位
- 周围环境是什么样?——建图
只有时刻明白自己在地图中的相对位置,机器人才能一边移动一边还原出地图的全貌。
SLAM 如何实现建图定位问题
经典 SLAM 流程:
- 传感器信息读取:通过各类传感器实现对环境的感知,比如通过激光雷达获取环境的深度信息。同时可以通过传感器融合来提高位置估计的精度,比如融合轮式里程计、IMU、雷达、深度相机数据等。
- 前端里程计(视觉/激光):根据相机获得的图像数据或激光雷达获得的点云数据,通过前后数据之间对比得出机器人位置的变化。
- 后端优化:对不同时刻下前端里程计和回环检测的信息进行整合和优化,得到全局一致的轨迹和地图。
- 回环检测:判断机器人是否到达过先前经过的位置,从而解决位置估计误差问题。
- 建图:将 SLAM 得到的环境信息作为地图存储下来,机器人之后在环境中的运动就可以通过已知的地图来导航了。
传感器
激光雷达
感兴趣的同学可以看一下我写的激光雷达概览:LiDAR 初探 | Grange's blog (grange007.github.io)
基本原理:
- 向被测物体射出一束激光,通过对激光方向、传播时间的计算,得到物体目前的位置
- 通过旋转的方式可向四周射出激光,从而获得周围环境的位置数据
- 最终得到离散的点云数据(每个点代表这个位置有个东西),点云的密度取决于激光雷达的帧率和点频
摄像头
通过相机拍摄的图像得到环境中物体相对机器人的位置(物体在图像中的深度)
-
单目相机:比较难以准确确定物体的深度
-
双目相机:由左右两个单目相机组成,可通过比较左右眼图像中同一像素的位置差异判断物体的远近
- 深度相机:相机内置红外结构光或激光传感器,可直接测出与物体的距离
前端里程计
-
通过相邻帧间的图像估计相机运动,并恢复场景的空间结构(图像特征匹配+几何位姿计算)
-
具有短时记忆,只能计算相邻时刻的运动
-
由于误差,可能存在累计偏移的问题,称为漂移(e.g. 每次前端里程计估计出来的物体方向都比实际向左偏了1°)
后端优化
收到的数据中存在噪声,要考虑如何从带有噪声的数据中估计整个系统的状态——滤波和非线性优化算法
需要较多的数学基础,前面的道路留给之后再探索吧~
回环检测
主要解决位置估计随时间漂移的问题
假设机器人经过一段时间的运动后回到了原点,但由于漂移,它计算出的位置估计值却没有回到原点,那么就应该把它计算的位置给拉回原点
主要通过视觉与机器学习方法完成:判断当前图像与历史图像的相似性,从而辨认出它们来自同一个地方
建图
3D & 2D 地图
- 存储地图的三维/二维位置数据
尺度地图
- 把真实世界按比例缩小,直接表示在地图上
栅格地图表示方法:
-
由许多小方块划分地图,用每一个方块的数值来表示地图信息
传感器存在噪声,机器人前方的某个位置到底有没有物体(障碍物)是不确定的。
采用概率**(占据率)**来解决这一问题
-
认为确实有物体的栅格的占据率为100%
-
确定没有物体的栅格占据率为0%,
-
不确定的栅格就用(确认占据概率/确认非占据概率)值表示占据率。
-
拓扑地图
-
只由节点和边组成
-
强调地图元素之间的连通关系
导航
在获得地图之后,导航要实现的就是从地图上找到距离目标点的最优路径,并将这一路径发送给底盘。如果说 SLAM 解决的是“我在哪”,导航就是要解决“我要怎么走”。
导航的具体实现方式有很多,Tinker 目前采用 Nav2 作为导航框架,以下导航内容也将基于 Nav2 进行讲解。